              IOI. 30 (Generare cod). Se considera un limbaj de programare care admite numai
instructiuni de urmatoarele doua tipuri:
x:=y;
x:=y*z;
unde x,y,z sunt variabile ntregi, nu neaparat distincte. Fiind date valorile naturale a,n(n<100)
se cere sa se scrie n acest limbaj un program care sa calculeze b=an cu un numar minim de nmultiri.
Pot fi utilizate oricte variabile suplimentare. 
De exemplu pentru n=13, un astfel de program este urmatorul:
x1:=a;
x2:=x1*x1;
x3:=x2*x2;
x4:=x3*x1;
x5:=x3*x3;
x6:=x4*x5;
b:=x6;
==========================================
Solutia   (Catalin Francu)
program GenerareCod;
var N,Prev,i,NBit:Integer;
begin
  Write('N=');ReadLn(N);
  WriteLn('x1:=a;');
  Prev:=N and 1;
  NBit:=8;repeat Dec(NBit) until N and (1 shl NBit)<>0;
  for i:=1 to NBit do
    begin
      WriteLn('x',1 shl i,':=x',1 shl (i-1),'*x',1 shl (i-1),';');
      if N and (1 shl i)<>0
        then begin
               if Prev>0
                 then WriteLn('x',Prev+1 shl i,':=x',1 shl i,'*x',Prev,';');
               Prev:=Prev+1 shl i;
             end;
    end;
  WriteLn('b:=x',N,';');
end.
--------------------------------
